package thread_case;

// 懒汉模式---多线程版
class SingletonLazy{
    // 这个引用指向唯一实例,初始化为 null,而不是立即创建实例
    private volatile static SingletonLazy instance = null;
    private static Object locker = new Object();
    private SingletonLazy() {}
    public static SingletonLazy getInstance() {
        // 如果 instance 为 null, 说明是首次调用,首次调用就需要考虑线程安全问题,需要加锁
        if (instance == null) {
            synchronized (locker) {
                if (instance == null){
                    // 首次调用 getInstance 方法,创建实例
                    instance = new SingletonLazy();
                }
            }
        }
        // 如果不是第一次调用 getInstance 方法,直接返回之前创建好的实例
        return instance;
    }
}

public class ThreadDemo2 {
    public static void main(String[] args) {
        // 利用"懒汉模式"实现的单例模式创建两个对象,观察这两个对象是否相同
        SingletonLazy b = SingletonLazy.getInstance();
        SingletonLazy b2 = SingletonLazy.getInstance();
        System.out.println(b==b2);
    }
}
